package com.itcast.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itcast.dao.CheckgroupDao;
import com.itcast.dao.SetmealDao;
import com.itcast.entity.PageResult;
import com.itcast.entity.QueryPageBean;
import com.itcast.pojo.CheckGroup;
import com.itcast.pojo.CheckItem;
import com.itcast.pojo.Setmeal;
import com.itcast.service.CheckgroupService;
import com.itcast.service.SetmealService;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

//soa架构必须在service层配置dubbo的service注解，并指明接口class文件
@Service(interfaceClass = CheckgroupService.class)
public class CheckgroupServiceImpl implements CheckgroupService {

    @Autowired
    private CheckgroupDao checkgroupDao;

    @Autowired
    private SetmealDao setmealDao;

    @Autowired
    private SetmealService setmealService;

    /**
     * 查询所有检查项数据
     * @return
     */
    @Override
    public List<CheckItem> findAll() {
        return checkgroupDao.findAll();
    }

    /**
     * 新增检查项   （包含检查组与检查项关联关系）
     * @param checkGroup
     * @param checkitemIds
     */
    @Override
    public void add(CheckGroup checkGroup, Integer[] checkitemIds) {
        checkgroupDao.add(checkGroup);
        Integer checkGroupId = checkGroup.getId();

        addCheckitemAndCheckgroup(checkitemIds, checkGroupId);
    }



    /**
     * 分页查询
     * @param queryPageBean
     * @return
     */
    @Override
    public PageResult findPage(QueryPageBean queryPageBean) {
        Integer currentPage = queryPageBean.getCurrentPage();
        Integer pageSize = queryPageBean.getPageSize();
        String queryString = queryPageBean.getQueryString();
        PageHelper.startPage(currentPage,pageSize);
        PageResult pageResult =null;
        if (queryString!=null){
            queryString=queryString.trim();
            if (!"null".equalsIgnoreCase(queryString)&& queryString.length()>0){
                queryString="%"+queryString+"%";
                 pageResult = getPageResult(queryString);
            }else {
                queryString=null;
                 pageResult = getPageResult(queryString);
            }
        }else {
            pageResult = getPageResult(queryString);
        }

        return pageResult;
    }

    /**
     * 根据ID查询  回显数据
     * @param id
     * @return
     */
    @Override
    public CheckGroup findById(int id) {
        CheckGroup checkGroup = checkgroupDao.fingById(id);
        return checkGroup;
    }

    /**
     * 根据id查询检查组所关联的检查项
     * @param id
     * @return
     */
    @Override
    public List<Integer> findCheckitemIdsByid(int id) {
        List<Integer> checkitemIds = checkgroupDao.findByCheckitemIds(id);
        return checkitemIds;
    }

    /**
     * 设置检查组
     * @param checkGroup
     * @param checkitemIds
     */
    @Override
    public void edit(CheckGroup checkGroup,Integer[] checkitemIds) {
        Integer id = checkGroup.getId();
        //删除关联关系
        checkgroupDao.delCheckItemandCheckgroup(id);
//        修改检查组信息
        checkgroupDao.updateCheckgroup(checkGroup);
//        重新增加关联关系（数据量大时，扛不住压力）
        addCheckitemAndCheckgroup(checkitemIds,id);

    }

    @Override
    public List<CheckGroup> findcheckgroupAll() {
        List<CheckGroup> checkgroupAll = checkgroupDao.findCheckgroupAll();
        return checkgroupAll;
    }

    @Override
    public List<Setmeal> findSetmealList(int id) {
        List<Integer> setmealIdList = new ArrayList<>();
        List<Integer> setmealIds = checkgroupDao.findSetmealIdsById(id);
        if (setmealIds!=null&&setmealIds.size()>0){
            for (Integer setmealId : setmealIds) {
                setmealIdList.add(setmealId);
            }
        }
        List<Setmeal> setmealList = new ArrayList<>();
        if (setmealIdList!=null&&setmealIdList.size()>0){
            for (Integer setmealId : setmealIdList) {
                Setmeal setmeal = setmealService.findById(setmealId);
                setmealList.add(setmeal);
            }
        }

        return setmealList;
    }

    /*
    抽取的分页查询方法
     */
    private PageResult getPageResult(String queryString) {
        Page<CheckGroup> page = checkgroupDao.findPage(queryString);
        long total = page.getTotal();
        List<CheckGroup> result = page.getResult();

        return new PageResult(total,result);
    }


    /**
     * 抽取新增检查组与检查项关联关系
     * @param checkitemIds
     * @param checkGroupId
     */
    private void addCheckitemAndCheckgroup(Integer[] checkitemIds, Integer checkGroupId) {
        for (Integer checkitemId : checkitemIds) {
            Map<String,Integer> map = new HashMap<>(16);
            map.put("checkitemId",checkitemId);
            map.put("checkGroup",checkGroupId);
            checkgroupDao.addCheckitemAndCheckgroup(map);
        }
    }


}
